1 module unde.games.dizzy.omega.squid; 2 3 import derelict.opengl3.gl; 4 import std.conv; 5 import std.math; 6 import std.format; 7 import unde.games.object; 8 import unde.games.renderer; 9 import unde.global_state; 10 11 class Squid:StaticGameObject 12 { 13 static int num; 14 int number; 15 16 int hidden; 17 18 enum SPEED = 0.1; 19 enum MAX_V = 0.02; 20 enum A = 0.00075; 21 22 float def_x, def_y, def_z; 23 float dx = 0.0, dy = 0.0; 24 float by, sy; 25 ulong delay; 26 27 this(MainGameObject root, float[3] coords, float by, 28 float sy = float.nan, float dx = 0.0, ulong delay = 0) 29 { 30 def_x = x = coords[0]; 31 def_y = y = coords[1]; 32 def_z = z = coords[2]; 33 34 this.by = by; 35 number = num++; 36 dy = 0.0; 37 this.dx = dx; 38 this.delay = delay; 39 this.sy = sy; 40 if (!sy.isNaN) y = sy; 41 42 super(root); 43 } 44 45 override void draw(GlobalState gs) 46 { 47 if (!hidden && abs(x-root.scrx) < 32 && 48 abs(y-root.scry) < 18) 49 { 50 uint frame = 0; 51 float dy = by - def_y; 52 if (y - def_y < dy/11) 53 frame = 0; 54 if (y - def_y < dy/11*2) 55 frame = 1; 56 if (y - def_y < dy/11*3) 57 frame = 2; 58 if (y - def_y < dy/11*4) 59 frame = 3; 60 if (y - def_y < dy/11*5) 61 frame = 4; 62 if (y - def_y < dy/11*6) 63 frame = 5; 64 if (y - def_y < dy/11*7) 65 frame = 6; 66 if (y - def_y < dy/11*8) 67 frame = 7; 68 if (y - def_y < dy/11*9) 69 frame = 8; 70 if (y - def_y < dy/11*10) 71 frame = 9; 72 if (y - def_y < dy) 73 frame = 10; 74 75 glDisable(GL_DEPTH_TEST); 76 glDisable(GL_CULL_FACE); 77 glPushMatrix(); 78 glTranslatef(x, y, z); 79 recursive_render(gs, root.models["squid-"~frame.to!(string)], null, null, false, true); 80 glPopMatrix(); 81 glEnable(GL_DEPTH_TEST); 82 glEnable(GL_CULL_FACE); 83 } 84 } 85 86 void hide() 87 { 88 hidden = true; 89 } 90 91 override bool tick(GlobalState gs) 92 { 93 if ( hidden || abs(root.scrx-x) > 16.0 && 94 abs(root.scrx-def_x) > 16.0 || 95 abs(root.scry-y) > 18.0 ) 96 return true; 97 98 frame++; 99 if (frame < delay) return true; 100 101 x += dx; 102 y += dy; 103 104 dy -= A; 105 if (sy.isNaN && dy < -MAX_V) dy = -MAX_V; 106 107 if (y < by) 108 dy = SPEED; 109 return true; 110 } 111 112 override void load(string[string] s) 113 { 114 string p = "squid"~number.to!(string); 115 if (p~"-x" in s) 116 x = s[p~"-x"].to!(float); 117 else 118 x = def_x; 119 120 if (p~"-y" in s) 121 y = s[p~"-y"].to!(float); 122 else 123 { 124 y = def_y; 125 if (!sy.isNaN) y = sy; 126 } 127 128 if (p~"-z" in s) 129 z = s[p~"-z"].to!(float); 130 else 131 z = def_z; 132 133 /*if (p~"-dx" in s) 134 dx = s[p~"-dx"].to!(float); 135 else 136 dx = 0.0;*/ 137 138 if (p~"-dy" in s) 139 dy = s[p~"-dy"].to!(float); 140 else 141 dy = 0.0; 142 143 frame = 0; 144 145 if (p in s) 146 { 147 hidden = (s[p] == "hidden")?1:0; 148 } 149 else 150 { 151 hidden = 0; 152 } 153 } 154 155 override void save(ref string[string] s) 156 { 157 string p = "squid"~number.to!(string); 158 if (hidden == 1) 159 s[p] = "hidden"; 160 161 s[p~"-x"] = x.to!(string); 162 s[p~"-y"] = y.to!(string); 163 s[p~"-z"] = z.to!(string); 164 //s[p~"-dx"] = dx.to!(string); 165 s[p~"-dy"] = dy.to!(string); 166 s[p~"-state"] = state.to!(string); 167 } 168 }